package ru.vyarus.dropwizard.guice.module.jersey.hk2; import com.google.inject.AbstractModule; import com.google.inject.Injector; import com.google.inject.binder.ScopedBindingBuilder; import org.glassfish.jersey.server.ContainerRequest; import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider; import org.glassfish.jersey.server.internal.process.AsyncContext; import javax.inject.Provider; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.container.ResourceInfo; import javax.ws.rs.core.*; import javax.ws.rs.ext.Providers; import static ru.vyarus.dropwizard.guice.module.installer.util.JerseyBinding.bindJerseyComponent; /** * Registers important services from HK2 context, making them available for injection in guice beans. * <ul> * <li>{@link javax.ws.rs.core.Application} * <li>{@link javax.ws.rs.ext.Providers} * <li>{@link javax.ws.rs.core.UriInfo} * <li>{@link javax.ws.rs.container.ResourceInfo} * <li>{@link javax.ws.rs.core.HttpHeaders} * <li>{@link javax.ws.rs.core.SecurityContext} * <li>{@link javax.ws.rs.core.Request} * <li>{@link org.glassfish.jersey.server.ContainerRequest} * <li>{@link org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider} * <li>{@link org.glassfish.jersey.server.internal.process.AsyncContext}</li> * </ul> * <p> * When guice servlet modules support disabled, enables bindings for http request and response objects, * which will work only within resources (because hk doesn't monitor outer scopes). * <p> * {@link org.glassfish.hk2.api.ServiceLocator} is registered by * {@link ru.vyarus.dropwizard.guice.module.jersey.GuiceFeature} * * @author Vyacheslav Rusakov * @since 15.11.2014 */ public class GuiceBindingsModule extends AbstractModule { private final Provider<Injector> provider; private final boolean guiceServletSupport; public GuiceBindingsModule(final Provider<Injector> provider, final boolean guiceServletSupport) { this.provider = provider; this.guiceServletSupport = guiceServletSupport; } @Override protected void configure() { jerseyToGuice(MultivaluedParameterExtractorProvider.class); jerseyToGuice(Application.class); jerseyToGuice(Providers.class); // request scoped objects, but hk will control their scope // must be used in guice only with Provider jerseyToGuice(UriInfo.class); jerseyToGuice(ResourceInfo.class); jerseyToGuice(HttpHeaders.class); jerseyToGuice(SecurityContext.class); jerseyToGuice(Request.class); jerseyToGuice(ContainerRequest.class); jerseyToGuice(AsyncContext.class); if (!guiceServletSupport) { // bind request and response objects when guice servlet module not registered // but this will work only for resources jerseyToGuice(HttpServletRequest.class); jerseyToGuice(HttpServletResponse.class); } } private ScopedBindingBuilder jerseyToGuice(final Class<?> type) { return bindJerseyComponent(binder(), provider, type); } }